%include "boot.inc"
;org 0x7e00
[bits 16]



mov dword [GDT_START_ADDRESS+0x00],0x00
mov dword [GDT_START_ADDRESS+0x04],0x00  

mov dword [GDT_START_ADDRESS+0x08],0x0000ffff    ; 基地址为0，段界限为0xFFFFF
mov dword [GDT_START_ADDRESS+0x0c],0x00cf9200    ; 粒度为4KB，存储器段描述符 

;建立保护模式下的堆栈段描述符       
mov dword [GDT_START_ADDRESS+0x10],0x00000000    ; 基地址为0x00000000，界限0x0 
mov dword [GDT_START_ADDRESS+0x14],0x00409600    ; 粒度为1个字节

;建立保护模式下的显存描述符    
mov dword [GDT_START_ADDRESS+0x18],0x80007fff    ; 基地址为0x000B8000，界限0x07FFF 
mov dword [GDT_START_ADDRESS+0x1c],0x0040920b    ; 粒度为字节

;创建保护模式下平坦模式代码段描述符
mov dword [GDT_START_ADDRESS+0x20],0x0000ffff    ; 基地址为0，段界限为0xFFFFF
mov dword [GDT_START_ADDRESS+0x24],0x00cf9800    ; 粒度为4kb，代码段描述符 



;初始化描述符表寄存器GDTR
mov word [pgdt], 39       ;描述符表的界限    
lgdt [pgdt]
       
in al,0x92                           ;南桥芯片内的端口 
or al,0000_0010B
out 0x92,al                          ;打开A20

cli                                  ;中断机制尚未工作
mov eax,cr0
or eax,1
mov cr0,eax                          ;设置PE位
      

 
;以下进入保护模式
jmp dword CODE_SELECTOR:protect_mode_begin

;16位的描述符选择子：32位偏移
;清流水线并串行化处理器
[bits 32]            
protect_mode_begin:      


mov eax, DATA_SELECTOR
mov ds, eax
mov gs, eax
mov eax, STACK_SELECTOR
mov ss, eax
mov eax, VIDEO_SELECTOR
mov es, eax

                          
;org 0x7c00

xor ax, ax 
;初始化段寄存器, 全部设为0

xor ebp,ebp		
mov ebx,ebp
mov ecx,ebp
mov edx,ebp
mov esi,ebp
mov esp,ebp
mov edi,ebp
add ebp,1          ;ebp=1

; 初始化栈指针
mov sp, 0x7c00
mov ax, 0xb800
;mov gs, ax
mov ah, 0x75 ;白色背景+洋红字

;延时
DEL1:mov edi,50000000

;输出
mov al, '1'

imul ecx,ebp,80    ;ecx=ebp*80
add ecx,ebx
mov [es:2*ecx], ax		;al显示在[ebp,ebx]位置

add ah,17

cmp edx,1
je left	;edx=1时，之前是向左

cmp edx,0
je right	;edx=0时，之前是向右

updown:
cmp esi,1	;esi=1时，之前是向上
je up

cmp esi,0	;esi=0时，之前是向下
je down

DEL2:
dec edi
cmp edi,0
jne DEL2
jmp DEL1




;方向
left:
cmp ebx,0
je right
dec ebx
mov edx,1
jmp updown

right:
cmp ebx,79
je left
inc ebx
mov edx,0
jmp updown

up:
cmp ebp,0
je down
dec ebp
mov esi,1
jmp DEL2

down:
cmp ebp,24
je up
inc ebp
mov esi,0
jmp DEL2




jmp $ ; 死循环

;times 510 - ($ - $$) db 0
;db 0x55, 0xaa


pgdt dw 0
     dd GDT_START_ADDRESS